function u = enforce_constraints(u, d_min, Ct_bounds, Cr_bounds)
    % 约束投影，确保粒子满足最小距离约束，并在可行范围内
    % u: 粒子位置向量 [ t1y,  t2y, ...,  ry]
    % d_min: 最小距离
    % Ct_bounds: 发射天线的可行范围，形如 [ y_min, y_max]
    % Cr_bounds: 接收天线的可行范围，形如 [ry_min, ry_max]

    % 提取天线信息
    N = (length(u) - 1) ; % 发射天线个数
    t = reshape(u(1:N), [1, N]); % 发射天线坐标 [1 × N]
    r = u(N+1:end);              % 接收天线坐标 [1 × 1]

    % --- 可行范围约束 ---
    % 发射天线坐标范围  [y_min, y_max]
    y_min = Ct_bounds(1); y_max = Ct_bounds(2);

    % 投影到发射天线范围
    t(:) = max(min(t(:), y_max), y_min); % 限制 y 坐标

    % 接收天线坐标范围 [ry_min, ry_max]
    ry_min = Cr_bounds(1); ry_max = Cr_bounds(2);

    % 投影到接收天线范围
    r = max(min(r, ry_max), ry_min); % 限制 ry

    % --- 最小距离约束 ---
    for i = 1:N
        for j = (i+1):N
            % 计算两天线的欧几里得距离
            dist = norm(t(i) - t(j));
            if (  (t(i) == Ct_bounds(1)) && (t(j) == Ct_bounds(1)) )
                t(j) = Ct_bounds(1) +  d_min;
                continue
            end
            if (  (t(i) == Ct_bounds(2)) && (t(j) == Ct_bounds(2)) )
                t(i) = Ct_bounds(2) - d_min;
                continue
            end
            if dist < d_min
                % 调整 j 天线的位置
                direction = (t(j) - t(i)) / dist; % 归一化方向向量
                % 计算需要的偏移量
                offset = (d_min - dist) / 2; % 每个天线部分调整
                
                % 将第 j 天线移出重叠位置
                t(j) = t(j) + direction * offset; % 移动j天线
                % 将第 i 天线向外移动
                t(i) = t(i) - direction * offset; % 移动i天线

                % 确保调整后天线仍在可行域内
              
                t(j) = max(min(t(j), y_max), y_min);
               
                t(i) = max(min(t(i), y_max), y_min);
            end
        end
    end

    % --- 更新位置向量 ---
    u = [t(:); r(:)];
end
